package com.qf.producer.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class ProducerMain {
    public static void main(String[] args) throws IOException, TimeoutException {
        //构建一个连接工厂(配置和rabbitmq的连接信息)
        ConnectionFactory factory = new ConnectionFactory();
        //设置rabbitmq的机器ip
        factory.setHost("localhost");
        //设置rabbitmq运行的端口
        factory.setPort(5672);
        //设置登录用户名
        factory.setUsername("guest");
        //设置登录密码
        factory.setPassword("guest");
        //设置写入数据的虚拟主机
        factory.setVirtualHost("cdm");

        //获取Connection对象
        Connection conn = factory.newConnection();
        //获取channel
        Channel channel = conn.createChannel();

        //利用channel发送消息
        //① 声明一个队列
        /*
            String queue :队列的名称
            boolean durable ：队列是否支持消息持久化
            boolean exclusive：队列是否当前连接独占。一般设置为不独占
            boolean autoDelete：队列是否自动删除。消息发完消费后，队列自动删掉.一般设置为不删除
            Map<String, Object> arguments：额外参数，比如消息的超时时间，消息的唯一标识
         */
        channel.queueDeclare("simple.que",true,false,false,null);

        //② 向队列中发送消息
        /*
            String exchange: 交换机，如果是一个简单模式/工作队列模式，交换机的名字留空
            String routingKey:路由键，交换机中的消息，会根据路由键的匹配方式，转到队列中。如果是简单模式/工作队列模式，这里写的是队列名称
            boolean mandatory：后期在做消息确认监听时需要
            boolean immediate：不支持
            BasicProperties props: 发送的消息的额外信息，会包含交换机、队列名称等
            byte[] body: 消息体内容

            String exchange, String routingKey, BasicProperties props, byte[] body
         */
        channel.basicPublish("","simple.que",null,"第二条rabbitmq消息".getBytes(StandardCharsets.UTF_8));

        //释放资源
        channel.close();
        conn.close();
    }
}
